package org.bouncycastle.crypto;

/**
 * the interface stream ciphers conform to.
 */
public interface StreamCipher {
    /**
     * Initialise the cipher.
     * 
     * @param forEncryption
     *            if true the cipher is initialised for encryption, if false for
     *            decryption.
     * @param params
     *            the key and other data required by the cipher.
     * @exception IllegalArgumentException
     *                if the params argument is inappropriate.
     */
    public void init(boolean forEncryption, CipherParameters params)
            throws IllegalArgumentException;

    /**
     * Return the name of the algorithm the cipher implements.
     * 
     * @return the name of the algorithm the cipher implements.
     */
    public String getAlgorithmName();

    /**
     * encrypt/decrypt a single byte returning the result.
     * 
     * @param in
     *            the byte to be processed.
     * @return the result of processing the input byte.
     */
    public byte returnByte(byte in);

    /**
     * process a block of bytes from in putting the result into out.
     * 
     * @param in
     *            the input byte array.
     * @param inOff
     *            the offset into the in array where the data to be processed
     *            starts.
     * @param len
     *            the number of bytes to be processed.
     * @param out
     *            the output buffer the processed bytes go into.
     * @param outOff
     *            the offset into the output byte array the processed data
     *            starts at.
     * @exception DataLengthException
     *                if the output buffer is too small.
     */
    public void processBytes(byte[] in, int inOff, int len, byte[] out,
            int outOff) throws DataLengthException;

    /**
     * reset the cipher. This leaves it in the same state it was at after the
     * last init (if there was one).
     */
    public void reset();
}
